<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // 1求3的平方的阶乘  + 5的平方的阶乘
        function func(a, b) {
            return factorial(a * a) + factorial(b * b)

            function factorial(num) {
                var chengji = 1
                for (var j = 1; j <= num; j++) {
                    chengji *= j
                }
                return chengji
            }
        }
        console.log(func(3, 5))

        /*
        2、 编写一个函数，输入n为偶数时，调用函数求1/2+1/4+...+1/n,
        当输入n为奇数时，调用函数求1+1/3+...+1/n
        */
        function func(n) {
            var oddSum = evenSum = 0
            for (var i = 1; i <= n; i++) {
                i % 2 ? oddSum += 1 / i : evenSum += 1 / i
            }

            return n % 2 ? oddSum : evenSum
        }
        console.log(func(6))


        /*
            3如果一个数恰好等于它的因数之和，则称该数为“完全数” perfect number。不包含自己 6=1＋2＋3
            //请列出2~10000的所有完全数
        */
        function func(a, b) {
            for (var i = a; i <= b; i++) {
                if (i === getFactorSum(i)) {
                    console.log(i)
                }
            }

            // 定义获取自身因数求和函数
            function getFactorSum(num) {
                var sum = 0
                for (var j = 1; j < num; j++) {
                    // !优先级高于/ * %
                    if (!(num % j)) {
                        sum += j
                    }
                }
                return sum
            }
        }
        func(2, 10000)
        /*
        6
        28
        496
        8128
        */



        //4 编写一个函数 ：实现计算任意一个数的各个位数的和 
        function getSum(num) {
            var sum = 0
            weishu = getWeishu(num)

            for (var i = 0; i < weishu; i++) {
                sum += parseInt(num / Math.pow(10, i)) % 10
            }
            return sum
            // 定义获取这个数的位数 函数
            function getWeishu(num) {
                var count = 0
                while (num) {
                    num = parseInt(num / 10)
                    count++
                }
                return count
            }
        }

        console.log(getSum(32131)) //10
        // 方法2 转为string
        function getSum(num) {
            var sum = 0
            var str = num.toString()
            for (var i = 0; i < str.length; i++) {
                sum += parseInt(str[i])
            }
            return sum
        }

        console.log(getSum(32131)) //10



        //5计算 100—200之间所有素数的和。 函数实现 判断是否素数可以定义一个函数
        function func(a, b) {
            var sum = 0
            for (var i = a; i <= b; i++) {
                isPrime(i) ? sum += i : null
            }
            return sum

            // 定义判断素数函数 是素数返回true 否则是false
            function isPrime(num) {
                var flag = true
                if (num == 1) {
                    flag = !flag
                }
                else {
                    for (var j = 2; j <= num / 2; j++) {
                        if (num % j == 0) {
                            flag = !flag
                            break
                        }
                    }

                }
                return flag
            }
        }
        console.log(func(100, 200)) //3167


        //6 输出：100 可以拆成哪两个素数的和？函数实现
        function func(num) {
            for (var i = 1; i <= parseInt(num / 2); i++) {
                // isPrime(i) && isPrime(100 - i)这两个都是true前提下，后面打印才执行。
                isPrime(i) && isPrime(num - i) && console.log(`${i}+${num - i}=${num}`)
            }

            // 定义判断素数函数 是素数返回true 否则是false
            function isPrime(num) {
                var flag = true
                if (num == 1) {
                    flag = !flag
                }
                else {
                    for (var j = 2; j <= num / 2; j++) {
                        if (num % j == 0) {
                            flag = !flag
                            break
                        }
                    }

                }
                return flag
            }
        }

        func(100)
        /*
        3+97=100
        11+89=100
        17+83=100
        29+71=100
        41+59=100
        47+53=100
        */


        // 7定义函数，功能是 输出m---n之间的闰年    传参数实现
        function func(m, n) {
            var arr = []
            for (var i = m; i <= n; i++) {
                if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
                    arr.push(i)
                }
            }
            return arr
        }
        console.log(func(1000, 2000))


        // 8 编写函数功能是将三个数按照从小到大顺序输出
        function fn() {
            for (var i = 0; i < arguments.length; i++) {
                for (var j = i; j < arguments.length; j++) {
                    if (arguments[i] >= arguments[j]) {
                        var temp = arguments[i]
                        arguments[i] = arguments[j]
                        arguments[j] = temp
                    }
                }
            }
            return [arguments[0], arguments[1], arguments[2]]

        }
        console.log(fn(10, 20, 8)) //[ 8, 10, 20 ]


        //9定义一个函数  功能求任意两个数的和 或者差  或积  或 商
        function func(a, b, pattern = '+') {
            switch (pattern) {
                case '+':
                    return a + b
                case '-':
                    return a - b
                case '*':
                    return a * b
                case '/':
                    return a / b
                default:
                    return console.log('运算符号输入错误')
            }

        }
        console.log(func(10, 20, '-'))


    </script>
</body>

</html>